home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / cpptask.exe / TSKFLG.CPP < prev    next >
C/C++ Source or Header  |  1991-08-21  |  3KB  |  179 lines

  1. /*
  2.    CPPTask - A Multitasking Kernel For C++
  3.  
  4.    Version 1.0 08-12-91
  5.  
  6.    Ported by Rich Smith from:
  7.  
  8.    Public Domain Software written by
  9.       Thomas Wagner
  10.       Patschkauer Weg 31
  11.       D-1000 Berlin 33
  12.       West Germany
  13.  
  14.    TSKFLG.CPP - Flag handling routines.
  15.  
  16.    Subroutines:
  17.         flag::flag
  18.         flag::~flag
  19.         flag::set_flag
  20.         flag::clear_flag
  21.         flag::wait_flag_set
  22.         flag::wait_flag_clear
  23.         flag::clear_flag_wait_set
  24.         flag::check_flag
  25.  
  26. */
  27.  
  28. #include <stdio.h>
  29.  
  30. #include "task.hpp"
  31. #include "tsklocal.hpp"
  32.  
  33.  
  34. /*
  35.    flag - initialises flag.
  36. */
  37.  
  38. flag::flag (void)
  39. {
  40.    flags = 0;
  41.  
  42.    wait_set = wait_clear = NULL;
  43.    state = 0;
  44. }
  45.  
  46. /*
  47.    ~flag - kills all processes waiting for flag
  48. */
  49.  
  50. flag::~flag (void)
  51. {
  52.    CRITICAL;
  53.  
  54.    C_ENTER;
  55.  
  56.    tsk_kill_queue (&wait_set);
  57.    tsk_kill_queue (&wait_clear);
  58.    state = 0;
  59.    C_LEAVE;
  60. }
  61.  
  62.  
  63. /*
  64.    wait_flag_set  - Wait until flag is != 0. If flag is != 0 on
  65.                     entry, the task continues to run.
  66. */
  67.  
  68. int far flag::wait_flag_set (dword timeout)
  69. {
  70.    CRITICAL;
  71.  
  72.    C_ENTER;
  73.    if (state)
  74.       {
  75.       C_LEAVE;
  76.       return 0;
  77.       }
  78.    tsk_current->set_retptr(NULL);
  79.    tsk_wait (&wait_set, timeout);
  80.    return (int)tsk_current->get_retptr();
  81. }
  82.  
  83.  
  84. /*
  85.    wait_flag_clear - Wait until flag is == 0. If flag is == 0 on
  86.                      entry, the task continues to run.
  87. */
  88.  
  89. int far flag::wait_flag_clear (dword timeout)
  90. {
  91.    CRITICAL;
  92.  
  93.    C_ENTER;
  94.    if (!state)
  95.       {
  96.       C_LEAVE;
  97.       return 0;
  98.       }
  99.  
  100.    tsk_current->set_retptr(NULL);
  101.    tsk_wait (&wait_clear, timeout);
  102.    return (int)tsk_current->get_retptr();
  103. }
  104.  
  105.  
  106. /*
  107.    set_flag - Set flag to 1. If there are tasks waiting for the
  108.               set state, all tasks in the queue are made eligible.
  109. */
  110.  
  111. void far flag::set_flag (void)
  112. {
  113.    CRITICAL;
  114.  
  115.    C_ENTER;
  116.    state = 1;
  117.  
  118.    while (wait_set != NULL)
  119.       wait_set = wait_set->tsk_runable ();
  120.    C_LEAVE;
  121. }
  122.  
  123.  
  124. /*
  125.    clear_flag - Set flag to 0. If there are tasks waiting for the
  126.                 clear state, all tasks in the queue are made eligible.
  127. */
  128.  
  129. void far flag::clear_flag (void)
  130. {
  131.    CRITICAL;
  132.  
  133.    C_ENTER;
  134.    state = 0;
  135.  
  136.    while (wait_clear != NULL)
  137.       wait_clear = wait_clear->tsk_runable ();
  138.  
  139.    C_LEAVE;
  140. }
  141.  
  142.  
  143. /*
  144.    clear_flag_wait_set - Set flag to 0, then wait for set state.
  145. */
  146.  
  147. int far flag::clear_flag_wait_set (dword timeout)
  148. {
  149.    clear_flag ();
  150.    return wait_flag_set (timeout);
  151. }
  152.  
  153.  
  154. /*
  155.    check_flag - return current flag state.
  156. */
  157.  
  158. int far flag::check_flag (void)
  159. {
  160.    return state;
  161. }
  162.  
  163.  
  164. void far asm_set_flag(flagptr flg)
  165. {
  166.     flg->set_flag();
  167. }
  168.  
  169.  
  170. void far asm_clear_flag(flagptr flg)
  171. {
  172.     flg->clear_flag();
  173. }
  174.  
  175. int far asm_wait_flag_clear(flagptr flg, dword timeout)
  176. {
  177.     return flg->wait_flag_clear(timeout);
  178. }
  179.